#include "seq_list.h"

//创建顺序表 方式1 返回值方式
seq_list* create_list1()
{
    seq_list* p = (seq_list*)malloc(sizeof(seq_list));  //开辟内存创建顺序表
    if(p == NULL)
    {
        printf("%s(%d):内存分配失败 请检查\n", __FILE__, __LINE__);
        exit(-1);
    }
    p->count = 0;   //count先清零 防止随机值的影响
    return p;
}
//创建顺序表 方式2 地址传递方式
int create_list2(seq_list** p)
{
    *p = (seq_list*)malloc(sizeof(seq_list));
    if(*p == NULL)
    {
        printf("%s(%d):内存分配失败 请检查\n", __FILE__, __LINE__);
        exit(-1);
    }
    (*p)->count = 0;
    return 0;
}

//1.按照位置插入元素
int insert_list(seq_list* my_list, int pos, int data)
{
     //※对指针形参要做非空检查
    if(NULL == my_list){
        printf("%s-%s(%d):入参为NULL 请检查\n", __FILE__, __func__, __LINE__);
        return -1;
    }
    //※检查位置的合理性
    if(pos<0 || pos > my_list->count)
    {
        printf("%s-%s(%d):插入位置不合理 插入失败\n", __FILE__, __func__, __LINE__);
        return -1;
    }
    //※检查表是否已满
    if(my_list->count == N){
        printf("%s-%s(%d):表已经满了 插入失败\n", __FILE__, __func__, __LINE__);
        return -1;
    }
    //开始插入
    int i = 0;
    for(i = my_list->count-1; i >= pos; i--)    //此处注意条件
    {
        my_list[i+1] = my_list[i];
    }
    my_list->s[pos].data = data;
    my_list->count++;
    printf("插入成功！\n");

    return 0;
}

//2.遍历顺序表----只是学习阶段用来看现象的
int print_list(seq_list* my_list)
{
    int i = 0;
    for(i = 0; i < my_list->count; i++)
    {
        printf("%d ", my_list->s[i].data);
    }
    putchar(10);

    return 0;
}

//2.1按照位置删除元素
int delete_from_list_by_pos(seq_list* my_list, int pos)
{
    //※对指针形参要做非空检查
    if(NULL == my_list){
        printf("%s-%s(%d):入参为NULL 请检查\n", __FILE__, __func__, __LINE__);
        return -1;
    }
    //※检查删除位置的合理性
    if(pos<0 || pos > my_list->count)
    {
        printf("%s-%s(%d):插入位置不合理 插入失败\n", __FILE__, __func__, __LINE__);
        return -1;
    }
    //检查表是否为空
    if(0 == my_list->count)
    {
        printf("%s-%s(%d):表为空 删除失败\n", __FILE__, __func__, __LINE__);
        return -1;
    }
    //删除
    int i = 0;
    for(i = pos+1; i < my_list->count; i++)
    {
        my_list->s[i-1] = my_list->s[i];
    }
    my_list->count--;
    printf("删除成功！\n");
    return 0;
}

//2.2按照值删除元素
int delete_from_list_by_value(seq_list* my_list, int delete_value)
{
    //※对指针形参要做非空检查
    if(NULL == my_list){
        printf("%s-%s(%d):入参为NULL 请检查\n", __FILE__, __func__, __LINE__);
        return -1;
    }
    //删除
    int i = 0;
    int j = 0;
    int flag = 0;   //放置漏掉相同的挨着的元素，eg：AAB
    int count = my_list->count; //记录开始元素个数
    for(i = 0;i < my_list->count; )
    {
        flag = 0;
        if(my_list->s[i].data == delete_value)
        {
            for(j = i+1; j < my_list->count; j++)
            {
                my_list->s[j-1] = my_list->s[j];
            }
            my_list->count--;
            printf("删除成功!\n");
            flag = 1;
        }
        if(flag == 0)
        {
            i++;
        }
    }
    if(i == count)
    {
        printf("未找到符合删除条件的数据！\n");
    }
    return 0;
}

//3.1按照位置修改元素
int modify_from_list_by_pos(seq_list* my_list, int pos, int new_value)
{
    //※对指针形参要做非空检查
    if(NULL == my_list){
        printf("%s-%s(%d):入参为NULL 请检查\n", __FILE__, __func__, __LINE__);
        return -1;
    }
    //※检查位置的合理性
    if(pos<0 || pos > my_list->count)
    {
        printf("%s-%s(%d):插入位置不合理 插入失败\n", __FILE__, __func__, __LINE__);
        return -1;
    }
    //修改
    my_list->s[pos].data = new_value;
    printf("修改成功！\n");

    return 0;
}

//3.2按照值修改元素
int modify_list_by_value(seq_list *my_list, int old_value, int new_value)
{
    int i = 0;
    for(i = 0; i < my_list->count; i++)
    {
        if(my_list->s[i].data == old_value)
        {
            my_list->s[i].data = new_value;
            printf("修改成功！\n");
        }
    }

    return 0;
}

//4.1根据指定位置查询数据
int check_list_by_pos(seq_list* my_list, int pos, node_t* temp)
{
    //※对指针形参要做非空检查
    if(NULL == my_list){
        printf("%s-%s(%d):入参为NULL 请检查\n", __FILE__, __func__, __LINE__);
        return -1;
    }
    //※检查位置的合理性
    if(pos<0 || pos > my_list->count)
    {
        printf("%s-%s(%d):查询位置不合理 查询失败\n", __FILE__, __func__, __LINE__);
        return -1;
    }
    //查询
    *temp = my_list->s[pos];
 
    return 0;
}

//4.2根据指定值查询数据
int check_list_by_value(seq_list* my_list, int value)
{
    //※对指针形参要做非空检查
    if(NULL == my_list){
        printf("%s-%s(%d):入参为NULL 请检查\n", __FILE__, __func__, __LINE__);
        return -1;
    }
    //查询
    int i = 0;
    int j = 0;
    for(i = 0; i < my_list->count; i++)
    {
        if(my_list->s[i].data == value)
        {
            return 1;
        }
    }
    return 0;
}

//5.释放顺序表
/*如果只是释放空间，传一级指针是没问题的
    但是如果想要给指针置NULL  就需要传二级指针*/
void free_list(seq_list** p)
{
    free(*p);
    *p = NULL;
}